package utils;

import graphviz.MetaModel.LiaisonDot;
import graphviz.MetaModel.enumeration.TypeLiaisonDot;

import java.util.Iterator;
import java.util.List;

import uspeedd.metamodel.enumeration.TypeAssociationUspeed;

/**
 * permet de faire des traitement specifiques.
 */
public class Utils 
{
	/**
	 * permet de savaoir quelle typed d'association uspeed il s'agit.
	 * @param val le string
	 * @return le type d'association.
	 */
    public static TypeAssociationUspeed isTypeAssociation(String val)
    {
    	if(val == null || val.length() == 0) return null;
    	
    	if(TypeAssociationUspeed.AGGREGATION.getnum().equalsIgnoreCase(val)) return TypeAssociationUspeed.AGGREGATION;
    	else if(TypeAssociationUspeed.COMPOSITION.getnum().equalsIgnoreCase(val)) return TypeAssociationUspeed.COMPOSITION;
    	else if(TypeAssociationUspeed.INHERITANCE.getnum().equalsIgnoreCase(val)) return TypeAssociationUspeed.INHERITANCE;
    	else if(TypeAssociationUspeed.DEPENDENCIES.getnum().equalsIgnoreCase(val)) return TypeAssociationUspeed.DEPENDENCIES;
    	else if(TypeAssociationUspeed.IMPLEMENT.getnum().equalsIgnoreCase(val)) return TypeAssociationUspeed.IMPLEMENT;
    	else if(TypeAssociationUspeed.EXTENDS.getnum().equalsIgnoreCase(val)) return TypeAssociationUspeed.EXTENDS;
    	   	
    	else return TypeAssociationUspeed.ASSOCIATION;
    }

    /**
     * permet de faire un equals en ignorant la casse.
     * @param first le premier String
     * @param second le second string
     * @return <true> si il sont egaux
     */
	public static boolean equals(String first, String second)
	{
		if((first == null && second != null) || (first != null && second == null)) return false;
		if(first == null && second == null) return true;
		
		return first.equalsIgnoreCase(second);
	}
    
	/**
	 * permet de lancer un equals sur n'inporte quel objet
	 * @param first le premier objet
	 * @param second le secon objet
	 * @return <true> si il sont egaux
	 */
	public static boolean equals(Object first, Object second)
	{
		if((first == null && second != null) || (first != null && second == null)) return false;
		if(first == null && second == null) return true;
		
		return first.equals(second);
	}
	
	/**
	 * permet de lancer un equals sur deux listes.
	 * @param list la premiere liste.
	 * @param list2 la deuxieme liste.
	 * @return <true> si il sont egaux
	 */
	public static <T> boolean equalsList(List<T> list, List<T> list2) 
	{
		if((list == null && list2 != null) || (list != null && list2 == null)) return false;
		if(list == null && list2 == null) return true;
		
		if(list.size() != list2.size()) return false;
		
		Iterator<T> itFirst = list.iterator(); 
		Iterator<T> itSecond = list2.iterator(); 
		
		while(itFirst.hasNext())
		{
			Object f = itFirst.next();
			boolean ok = true;
			
			while(itSecond.hasNext() && ok)
			{
				Object s = itSecond.next();
				
				if(equals(f, s)) ok = false;
			}
			
			if(ok)
			{
				return false;
			}
			ok = true;
		}
		
		return true;
	}

	/**
	 * permte de trouver la bonne liaison entre deux elements
	 * @param attribute le type de la liaison.
	 * @param liaison la liaison a completer
	 */
	public static void isTypeLiaison(String attribute, LiaisonDot liaison) 
	{
		if(attribute == null || liaison == null) return;
			
		if(Utils.equals(attribute, TypeAssociationUspeed.IMPLEMENT)) liaison.setLiaison(TypeLiaisonDot.TRAI_FLECHE);
		if(Utils.equals(attribute, TypeAssociationUspeed.EXTENDS))  liaison.setLiaison(TypeLiaisonDot.TRAI_FLECHE);
		else
		{
			 liaison.setLiaison(TypeLiaisonDot.TRAIT);
			 liaison.add(TypeLiaisonDot.POINTIER);
		}
		
		liaison.setLiaison(TypeLiaisonDot.TRAI_FLECHE); //TODO petit probleme sur la reconnaissance
		return; 
	}
}
